﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Infrastructure.Model;

namespace Infrastructure.Attribute
{
    /// <summary>
    /// 自定义操作日志记录特性，用于标记需要记录操作日志的控制器方法
    /// </summary>
    /// <remarks>
    /// 示例用法：
    /// [Log("用户登录", BusinessType.Login)]  // 完整参数
    /// [Log("查询操作")]                   // 简化用法
    /// [Log]                              // 最简用法（需单独设置属性）
    /// </remarks>
    public class LogAttribute : System.Attribute
    {
        /// <summary>
        /// 操作标题（必填）
        /// </summary>
        /// <example>用户登录、数据导出</example>
        public string Title { get; set; }

        /// <summary>
        /// 业务类型（默认BusinessType.Other）
        /// </summary>
        public BusinessType BusinessType { get; set; }

        /// <summary>
        /// 是否保存请求参数（默认true）
        /// </summary>
        /// <remarks>
        /// 敏感操作（如密码修改）建议设为false
        /// </remarks>
        public bool IsSaveRequestData { get; set; } = true;

        /// <summary>
        /// 是否保存响应结果（默认true）
        /// </summary>
        /// <remarks>
        /// 大数据量响应建议设为false
        /// </remarks>
        public bool IsSaveResponseData { get; set; } = true;

        /// <summary>
        /// 默认构造函数（需要后续手动设置属性）
        /// </summary>
        public LogAttribute()
        {
        }

        /// <summary>
        /// 带标题的构造函数
        /// </summary>
        /// <param name="name">操作标题</param>
        public LogAttribute(string name)
        {
            Title = name;
        }

        /// <summary>
        /// 完整参数构造函数
        /// </summary>
        /// <param name="name">操作标题</param>
        /// <param name="businessType">业务类型枚举</param>
        /// <param name="saveRequestData">是否保存请求数据（默认true）</param>
        /// <param name="saveResponseData">是否保存响应数据（默认true）</param>
        public LogAttribute(string name,
                           BusinessType businessType,
                           bool saveRequestData = true,
                           bool saveResponseData = true)
        {
            Title = name;
            BusinessType = businessType;
            IsSaveRequestData = saveRequestData;
            IsSaveResponseData = saveResponseData;
        }
    }
}
